﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QuanLyPhongKham
{
    public partial class ucChiDinh : BaseUserControl
    {
        private DAL.AccessData m = new DAL.AccessData();
        private DataSet ds = new DataSet();
        private string s_mabn, s_hoten, s_namsinh, s_phai, s_ngay, s_bacsi, s_chandoan, s_makp, s_mabs,s_ngaycapdon;
        private long l_maql, l_id = 0, l_maql_old;
        private int i_userid, i_mavp, i_madoituong;
        private DataTable dtmabd=new DataTable();
        private DataTable dtct = new DataTable();
        private DataTable dtsave = new DataTable();
        private DataTable dtxoa = new DataTable();
        private DataTable dtthem = new DataTable();
        private bool bNew = false, bEdit = false;
        public ucChiDinh(long maql,string mabn,string hoten,string namsinh,string phai,string ngay,string bacsi,string chandoan,string mabs,string makp,int userid,int madoituong)
        {
            InitializeComponent();
            l_maql = maql;
            s_mabn = mabn; s_hoten = hoten;
            s_namsinh = namsinh; s_ngay = ngay;
            s_bacsi = bacsi; s_chandoan = chandoan;
            s_mabs = mabs; s_makp = makp; i_userid = userid;
            s_phai = phai; i_madoituong = madoituong;
        }

        private void frmChidinh_Load(object sender, EventArgs e)
        {
            bNew = true; bEdit = false;
            load_thongtinbn();
            load_sudungdichvu();
            load_grid();
            AddGridTableStyle(true);
            if (dtct.Rows.Count > 0) ena_button(true);
            else ena_button(false);
            ghichu.Focus();
        }

        private void frmChidinh_SizeChanged(object sender, EventArgs e)
        {
            bNut.Location = new Point((this.Width - 628) / 2 + 1, 301 + this.Height - 470);
            gDichvu.Location = new Point((this.Width - 628) + 481, 0);
            gDichvu.Size = new Size(gDichvu.Width, 284 + (this.Height - 470));
            gCaclansudung.Location = new Point((this.Width - 628) + 481, 0);
            gCaclansudung.Size = new Size(gCaclansudung.Width, 284 + (this.Height - 470));
            dataGrid1.Size = new Size(dataGrid1.Width, 269 + (this.Height - 470));
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)
            {
                try
                {
                    s_ngaycapdon = e.Node.FullPath.Substring(0,10);
                    l_id = long.Parse(e.Node.Tag.ToString());
                    if (l_id != 0)
                    {
                        DataRow r = m.getrowbyid(ds.Tables[0], "id=" + l_id);
                        if (r != null)
                        {
                            l_maql_old = long.Parse(r["maql"].ToString());
                            ghichu.Text = r["ghichu"].ToString();
                        }
                        load_grid();
                        dataGrid1.TableStyles.Clear();
                        AddGridTableStyle(true);
                        ena_button(true);
                        ena_object(false);
                    }
                }
                catch { }
            }
        }
        private void MaskDigit(KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.') e.Handled = false;
            else e.Handled = true;
        }
        private void load_sudungdichvu()
        {
            treeView1.Nodes.Clear();
            ds = m.get_data("select a.id,a.maql,a.ghichu,to_char(a.ngay,'dd/mm/yyyy hh24:mi') as ngay,to_char(ngay,'yyyymmddhhmi') as sort,a.stt,a.mavp,c.ma,trim(c.ten) as ten,c.dvt,a.soluong from " + m.user + ".v_chidinh a," + m.user + ".v_giavp c where a.mavp=c.id and a.mabn='" + mabn.Text + "' order by sort desc,stt asc");
            TreeNode node = new TreeNode();
            TreeNode node_con;
            string s_node = "";
            bool be = false;
            foreach (DataRow r in ds.Tables[0].Rows)
            {
                be = false;
                if (s_node != r["id"].ToString())
                {
                    node = new TreeNode(r["ngay"].ToString());
                    if (l_maql == long.Parse(r["maql"].ToString()))
                    {
                        l_maql_old = long.Parse(r["maql"].ToString());
                        l_id = long.Parse(r["id"].ToString());
                        s_ngaycapdon = r["ngay"].ToString().Substring(0,10);
                    }
                    s_node = r["id"].ToString();
                    node.Tag = r["id"].ToString();
                    be = true;
                }
                node_con = new TreeNode(r["ten"].ToString() + " (" + decimal.Parse(r["soluong"].ToString()) + ")");
                node.Nodes.Add(node_con);
                if (be)
                {
                    treeView1.Nodes.Add(node);
                }
            }
        }
        private void load_grid()
        {
            dtct = m.get_data("select a.mavp as id, a.stt, b.ma, trim(b.ten) as ten, b.dvt, a.soluong, a.dongia,a.done,a.paid,to_char(a.ngay,'dd/mm/yyyy hh24:mi') as ngay from " + m.user + ".v_chidinh a," + m.user + ".v_giavp b where a.mavp=b.id and a.id=" + l_id + " order by a.stt").Tables[0];
            dataGrid1.DataSource = dtct;
            dtxoa = dtct.Clone();
        }
        private void AddGridTableStyle(bool edit)
        {
            DataGridColoredTextBoxColumn TextCol;
            delegateGetColorRowCol de = new delegateGetColorRowCol(MyGetColorRowCol);
            DataGridTableStyle ts = new DataGridTableStyle();
            ts.MappingName = dtct.TableName;
            ts.AlternatingBackColor = Color.Linen;
            ts.BackColor = Color.GhostWhite;
            ts.ForeColor = Color.MidnightBlue;
            ts.GridLineColor = SystemColors.Control;
            ts.HeaderBackColor = SystemColors.Control;
            ts.HeaderForeColor = Color.Navy;
            ts.SelectionBackColor = Color.Teal;
            ts.SelectionForeColor = Color.White;
            ts.ReadOnly = false;
            ts.RowHeaderWidth = 5;

            TextCol = new DataGridColoredTextBoxColumn(de, 0);
            TextCol.MappingName = "id";
            TextCol.HeaderText = "id";
            TextCol.Width = 0;
            TextCol.ReadOnly = true;
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 1);
            TextCol.MappingName = "stt";
            TextCol.HeaderText = "Stt";
            TextCol.Width = 40;
            TextCol.ReadOnly = true;
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 2);
            TextCol.MappingName = "ma";
            TextCol.HeaderText = "Mã";
            TextCol.Width = 80;
            TextCol.ReadOnly = true;
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 3);
            TextCol.MappingName = "ten";
            TextCol.HeaderText = "Tên dịch vụ";
            TextCol.Width = 550;
            TextCol.ReadOnly = true;
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 4);
            TextCol.MappingName = "dvt";
            TextCol.HeaderText = "ĐVT";
            TextCol.Width = 70;
            TextCol.ReadOnly = true;
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 5);
            TextCol.MappingName = "soluong";
            TextCol.HeaderText = "Số lượng";
            TextCol.Width = 100;
            TextCol.ReadOnly = edit;
            TextCol.Format = "###,###,###,##0";
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 6);
            TextCol.MappingName = "dongia";
            TextCol.HeaderText = "Đơn giá";
            TextCol.Width = 100;
            TextCol.ReadOnly = true;
            TextCol.Format = "###,###,###,##0";
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 7);
            TextCol.MappingName = "done";
            TextCol.HeaderText = "done";
            TextCol.Width = 0;
            TextCol.ReadOnly = true;
            TextCol.Format = "###,###,###,##0";
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            TextCol = new DataGridColoredTextBoxColumn(de, 8);
            TextCol.MappingName = "paid";
            TextCol.HeaderText = "paid";
            TextCol.Width = 0;
            TextCol.ReadOnly = true;
            TextCol.Format = "###,###,###,##0";
            ts.GridColumnStyles.Add(TextCol);
            dataGrid1.TableStyles.Add(ts);

            CurrencyManager cm = (CurrencyManager)BindingContext[dataGrid1.DataSource, dataGrid1.DataMember];
            DataView dv = (DataView)cm.List;
            dv.AllowNew = false;
        }
        public Color MyGetColorRowCol(int row, int col)
        {
            Color c = Color.Navy;
            try
            {
                if (int.Parse(dataGrid1[row, 7].ToString()) == 1 || int.Parse(dataGrid1[row, 8].ToString()) == 1)
                {
                    c = Color.Red;
                }
                if (row == dataGrid1.CurrentRowIndex)
                {
                    dataGrid1.Select(row);
                    c = Color.White;
                }
            }
            catch
            {
            }
            return c;
        }
        public delegate Color delegateGetColorRowCol(int row, int col);
        public class DataGridColoredTextBoxColumn : DataGridTextBoxColumn
        {
            private delegateGetColorRowCol _getColorRowCol;
            private int _column;
            public DataGridColoredTextBoxColumn(delegateGetColorRowCol getcolorRowCol, int column)
            {
                _getColorRowCol = getcolorRowCol;
                _column = column;
            }
            protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight)
            {
                try
                {
                    foreBrush = new SolidBrush(_getColorRowCol(rowNum, this._column));
                }
                catch { }
                finally
                {
                    base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
                }
            }
        }
        private void load_thongtinbn()
        {
            mabn.Text = s_mabn; hoten.Text = s_hoten; namsinh.Text = s_namsinh;
            ngaykham.Text = s_ngay; bacsi.Text = s_bacsi; chandoan.Text = s_chandoan; txtGioitinh.Text = s_phai;
        }
        private void ena_button(bool ena)
        {
            butMoi.Enabled = ena;
            butLuu.Enabled = !ena;
            butXoa.Enabled = !ena;
            butChon.Enabled = !ena;
            butSua.Enabled = ena;
            butHuy.Enabled = ena;
            butBoqua.Enabled = !ena;
            butIn.Enabled = ena;
            butKetthuc.Enabled = ena;
        }
        private void butLuu_Click(object sender, EventArgs e)
        {
            if (dtct.Rows.Count <= 0 && !bEdit) return;
            l_id = (bNew) ? m.get_capid : l_id;
            if (bEdit&&!bNew)
            {
                foreach (DataRow r in dtxoa.Rows)
                {
                    m.execute_data("delete from " + m.user + ".v_chidinh where id=" + l_id + " and stt=" + int.Parse(r["stt"].ToString()));
                    m.upd_theodoisua(m.get_capid_theodoisua, mabn.Text, l_maql, int.Parse(r["id"].ToString()), r["ten"].ToString(), decimal.Parse(r["soluong"].ToString()), i_userid, "BN", "v_chidinh", 0, 0, 1);
                }
                foreach (DataRow r in dtthem.Rows)
                    m.upd_theodoisua(m.get_capid_theodoisua, mabn.Text, l_maql, int.Parse(r["id"].ToString()), r["ten"].ToString(), decimal.Parse(r["soluong"].ToString()), i_userid, "BN", "v_chidinh", 1, 0, 0);
                foreach (DataRow r in dtct.Rows)
                {
                    DataRow nr = m.getrowbyid(dtsave, "id=" + int.Parse(r["id"].ToString()));
                    if (nr != null)
                    {
                        decimal d_soluongcu = decimal.Parse(nr["soluong"].ToString());
                        if (d_soluongcu != decimal.Parse(r["soluong"].ToString()))
                            m.upd_theodoisua(m.get_capid_theodoisua, mabn.Text, l_maql, int.Parse(r["id"].ToString()), r["ten"].ToString(), d_soluongcu, i_userid, "BN", "v_chidinh", 0, 1, 0);
                    }
                }
            }
            string s_ngayhh = m.ngay_update_server;
            foreach (DataRow r in dtct.Rows)
            {
                long idchidinh=m.get_capid_chidinh;
                m.upd_chidinh(l_id, int.Parse(r["stt"].ToString()), mabn.Text, l_maql, (bNew?s_ngayhh:r["ngay"].ToString()), s_makp, i_madoituong, int.Parse(r["id"].ToString()), decimal.Parse(r["soluong"].ToString()), decimal.Parse(r["dongia"].ToString()), 0, 0, i_userid, idchidinh, ghichu.Text,s_mabs);
            }
            if (bNew) s_ngaycapdon = m.ngayhienhanh_server;
            bNew = false; bEdit = false;
            ena_object(false);
            load_grid();
            dataGrid1.TableStyles.Clear();
            AddGridTableStyle(true);
            load_sudungdichvu();
            ena_button(true);
        }
        private bool kiemtra_sudung()
        {
            foreach (DataRow r in m.get_data("select a.id,to_char(a.ngay,'dd/mm/yyyy') as ngay,b.tenkp from " + m.user + ".v_chidinh a,"+m.user+".btdkp b where a.makp=b.makp and to_char(a.ngay,'dd/mm/yyyy')='" + m.ngayhienhanh_server + "' and a.mabn='" + mabn.Text + "' and a.maql=" + l_maql).Tables[0].Rows)
            {
                MessageBox.Show("Trong ngày người bệnh đã được chỉ định dịch vụ tại phòng khám ["+r["tenkp"].ToString().ToUpper()+"]!", DAL.AccessData.Msg);
                l_id = long.Parse(r["id"].ToString());
                s_ngaycapdon = r["ngay"].ToString();
                load_grid();
                return true;
            }
            return false;
        }

        private void butSua_Click(object sender, EventArgs e)
        {
            if (l_id == 0) return;
            if ((s_ngaycapdon != m.ngayhienhanh_server && s_ngaycapdon != "") || l_maql != l_maql_old)
            {
                MessageBox.Show("Các dịch vụ này đã chỉ định vào ngày khác hoặc của đợt điều trị khác, không được chỉnh sửa!", DAL.AccessData.Msg);
                return;
            }
            dtsave = dtct.Copy();
            dtxoa.Clear(); dtthem.Clear();
            bEdit = true; bNew = false;
            ena_button(false);
            ena_object(true);
            dataGrid1.TableStyles.Clear();
            AddGridTableStyle(false);
        }

        private void butHuy_Click(object sender, EventArgs e)
        {
            try
            {
                if (dtct.Rows.Count == 0 || l_id == 0) return;
                if (dtct.Select("done=1 or paid=1", "").Length > 0)
                {
                    MessageBox.Show("Một trong các dịch vụ này đã được viện phí cập nhật, không được huỷ toàn bộ!", DAL.AccessData.Msg); return;
                }
                if (s_ngaycapdon != m.ngayhienhanh_server && s_ngaycapdon != "")
                {
                    MessageBox.Show("Các dịch vụ này được chỉ định vào ngày khác, không được huỷ!", DAL.AccessData.Msg); return;
                }
                if (MessageBox.Show("Đồng ý hủy các dịch vụ này ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    m.execute_data("delete from " + m.user + ".v_chidinh where id=" + l_id);
                    m.delrec(dtct, "true");
                    load_sudungdichvu();
                    dataGrid1.Refresh();
                }
            }
            catch
            {
            }
        }

        private void butBoqua_Click(object sender, EventArgs e)
        {
            bNew = false; bEdit = false;
            ena_button(true);
            ena_object(false);
            load_grid();
            dataGrid1.TableStyles.Clear();
            AddGridTableStyle(true);
        }

        private void ena_object(bool ena)
        {
            ghichu.Enabled = ena;
        }

        private void dataGrid1_CurrentCellChanged(object sender, EventArgs e)
        {
            try 
            {
                i_mavp = int.Parse(dataGrid1[dataGrid1.CurrentCell.RowNumber, 0].ToString());
            }
            catch { i_mavp = 0; }
        }

        private void butMoi_Click(object sender, EventArgs e)
        {
            bNew = true; bEdit = false;
            dtct.Clear();
            dtsave.Clear();
            dtxoa.Clear();
            dataGrid1.Refresh();
            ena_button(false);
            ghichu.Focus();
        }

        private void butKetthuc_Click(object sender, EventArgs e)
        {
            //fix:
            //this.Close();
        }

        private void butXoa_Click(object sender, EventArgs e)
        {
            DataRow r = m.getrowbyid(dtct, "id=" + i_mavp);
            if(r!=null)
            {
                if (r["done"].ToString() == "1" || r["paid"].ToString() == "1")
                {
                    MessageBox.Show("Dịch vụ này đã được viện phí cập nhật, không được xoá!", DAL.AccessData.Msg); return;
                }
                if(bEdit) m.updrec_chidinh(dtxoa, i_mavp, int.Parse(r["stt"].ToString()), r["ma"].ToString(), r["ten"].ToString(), r["dvt"].ToString(), decimal.Parse(r["soluong"].ToString()), decimal.Parse(r["dongia"].ToString()));
                m.delrec(dtct, "id=" + i_mavp);
                dtct.AcceptChanges();
                dataGrid1.Refresh();
            }
        }

        private void butChon_Click(object sender, EventArgs e)
        {
            ena_button(false);
            ucDichVu f = new ucDichVu(dtct);
            //fix:
            //f.ShowDialog();
            dataGrid1.TableStyles.Clear();
            AddGridTableStyle(false);
            dtct = f.dtct;
            dtthem = f.dtthem;
            dtct.AcceptChanges();
            dtthem.AcceptChanges();
            dataGrid1.Refresh();
        }
    }
}